home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 196_01 / fp64.csm < prev    next >
Text File  |  1985-11-13  |  41KB  |  3,082 lines

  1. ;/*
  2. ;*****************************************************************
  3. ;*    Written by : Hakuo Katayose (JUG-CP/M No.179)        *
  4. ;*        JIP 980                        *
  5. ;*        49-114     kawauchi-Sanjuunin-machi        *
  6. ;*        Sendai, Miyagi, Japan.                *
  7. ;*        Telph.No (0222)61-3219                *
  8. ;*    Edited  by :                         *
  9. ;*                                *
  10. ;*****************************************************************
  11. ;*/
  12. ;
  13.     INCLUDE    "BDS.LIB"
  14.  
  15.  
  16. BIASEXP    EQU    0400H
  17. NBYTES    EQU    8
  18.  
  19. ;
  20. ;--------------------------------------------------------------
  21. ;--------------------------------------------------------------
  22. ;
  23. ; 64_bit INTEGER basic_subroutines.
  24. ;
  25. ;    IMUL64    64_bit multiplay.    LA   =  LA  * (hl).
  26. ;    IDIV64    64_bit divide.        LA   =  LA  / (hl).
  27. ;    IADDA    64_bit addition.    LA   =  LA  + (hl).
  28. ;    ISUBA    64_bit subtruction.    LA   =  LA  - (hl).
  29. ;    
  30. ;    IADD64    64_bit addition.    (de) = (de) + (hl).
  31. ;    ISUB64    64_bit subtruction.    (de) = (de) - (hl).
  32. ;    
  33. ;    ICMP64    64_bit compare.        c,z  = (de) - (hl).
  34. ;
  35. ;    INEG64    64_bit negation.    (hl) = ~(hl).
  36. ;    
  37. ;    SFTL64    64_bit left shift.    (carry set).
  38. ;    SFTR64    64_bit right shift.    (carry set).
  39. ;    
  40. ;    DSHFTL    128_bit left  shift.
  41. ;    DSHFTR    128_bit right shift.
  42. ;    
  43. ;    ITENTH    64_bit 10 times.    (hl) = (hl) * 10.
  44. ;    
  45. ;
  46. ; work area:
  47. ;    TEN    64_bit constant.    10.
  48. ;    LLWORK    LLong type work_area.
  49. ;    
  50. ;--------------------------------------------------------------
  51. ;
  52.  
  53. ;
  54. ;--------------------------------------------------------------
  55. ;--------------------------------------------------------------
  56. ;
  57. ; 64_bit floting opration result flags.
  58. ;
  59. ;    EP        1  byte length.
  60. ;    OUTSGN        1  byte length.
  61. ;    OUTBUF        20 byte length.
  62. ;    
  63. ;    OVF        1  byte length.
  64. ;    UNF        1  byte length.
  65. ;    ZERO        1  byte length.
  66. ;    MINUS        1  byte length.
  67. ;
  68. ;--------------------------------------------------------------
  69. ;    
  70. ; 64_bit floting work_registers.
  71. ;
  72. ;    TEMPW        16 byte length.
  73. ;    
  74. ;    UU        nbytes byte length.
  75. ;    VV        nbytes byte length.
  76. ;    WW        nbytes byte length.
  77. ;    XX        nbytes byte length.
  78. ;    YY        nbytes byte length.
  79. ;    
  80. ;--------------------------------------------------------------
  81. ;
  82. ; 64_bit floting Acc registers.
  83. ;
  84. ;    LA    64_bit floting ACC_A.        A_Acc extention.
  85. ;    AREG    64_bit floting ACC_A.        A_Acc.
  86. ;    AEXP    64_bit floting ACC_A.        expornemt.
  87. ;    ASIGN    64_bit floting ACC_A.        sign_flag.
  88. ;    
  89. ;    LB    64_bit floting ACC_B.        B_Acc extention.
  90. ;    BREG    64_bit floting ACC_B.        B_Acc.
  91. ;    BEXP    64_bit floting ACC_B.        expornemt.
  92. ;    BSIGN    64_bit floting ACC_B.        sign_flag.
  93. ;    
  94. ;    TEN1    64_bit floting constant.    10.0
  95. ;    ONE    64_bit floting constant.     1.0
  96. ;    TENM1    64_bit floting constant.     0.1
  97. ;    NUM0    64_bit floting constant.     0.0
  98. ;
  99. ;
  100. ;
  101. ;
  102.  
  103.     FUNCTION    fp64
  104.     call    arghak
  105.     push    b
  106.  
  107.     lda    arg1
  108.     cpi    255
  109.     jz    FPTST1
  110.     cpi    254
  111.     jz    FPTST2
  112.  
  113.     lhld    arg1
  114.     dad    h
  115.     lxi    b,JMPTBL
  116.     dad    b
  117.     mov    a,m
  118.     inx    h
  119.     mov    h,m
  120.     mov    l,a
  121.     push    h
  122.     popix
  123.  
  124.     lhld    arg3
  125.     xchg
  126.     lhld    arg2        ; de = arg3. hl = arg2.
  127.  
  128.     pcix
  129.  
  130. JMPTBL:    dw    FPGETK
  131.     dw    FPADD        ; no.1
  132.     dw    FPSUB
  133.     dw    FPMUL
  134.     dw    FPDIV
  135.     dw    FPCMP
  136.     dw    FPNEG
  137.     dw    FPSFT
  138.     dw    FPHALF
  139.     dw    FPDBL
  140.     dw    FPCNV        ; no.10
  141.     dw    FPIN
  142.     dw    SQRT
  143.     dw    SIN
  144.     dw    ATAN2
  145.     dw    EXPP
  146.     dw    LOG
  147.     dw    exitp        ;jmp17
  148.     dw    exitp        ;jmp18
  149.     dw    exitp        ;jmp19
  150.     dw    exitp        ;jmp20
  151.     dw    LLADD
  152.     dw    LLSUB
  153.     dw    LLMUL
  154.     dw    LLDIV
  155.     dw    LLCMP
  156.     dw    LLNEG
  157.     dw    LLMOV
  158.     dw    LLSFTL
  159.     dw    LLSFTR
  160.     dw    ATOLL
  161.     dw    LLTOA
  162.     dw    LLTEN
  163.  
  164. exitp:    lhld    arg4
  165.     xchg
  166.     call    pack
  167.     lxi    h,OVF
  168.     xra    a
  169.     ora    m
  170.     inx    h
  171.     ora    m
  172.     inx    h
  173.     ora    m
  174.     inx    h
  175.     ora    m
  176.     mov    l,a
  177.     mvi    h,0
  178.     pop    b
  179.     ret
  180. ;
  181. ;
  182. ;
  183. FPADD:    push    h
  184.     lxi    h,BREG
  185.     call    unpack        ; (arg3) --> Bcc. (Unpack).
  186.     pop    d
  187.     lxi    h,AREG
  188.     call    unpack        ; (arg2) --> Acc. (Unpack).
  189.     call    FPADD0
  190.     jmp    exitp
  191. ;
  192. ;
  193. FPSUB:    push    h
  194.     lxi    h,BREG
  195.     call    unpack        ; (arg3) --> Bcc. (Unpack).
  196.     pop    d
  197.     lxi    h,AREG
  198.     call    unpack        ; (arg2) --> Acc. (Unpack).
  199.     call    FPSUB0
  200.     jmp    exitp
  201. ;
  202. ;
  203. FPMUL:    push    h
  204.     lxi    h,BREG
  205.     call    unpack        ; (arg3) --> Bcc. (Unpack).
  206.     pop    d
  207.     lxi    h,AREG
  208.     call    unpack        ; (arg2) --> Acc. (Unpack).
  209.     call    FPMUL0
  210.     jmp    exitp
  211. ;
  212. ;
  213. FPDIV:    push    h
  214.     lxi    h,BREG
  215.     call    unpack        ; (arg3) --> Bcc. (Unpack).
  216.     pop    d
  217.     lxi    h,AREG
  218.     call    unpack        ; (arg2) --> Acc. (Unpack).
  219.     call    FPDIV0
  220.     jmp    exitp
  221. ;
  222. ;
  223. FPCMP:    lxi    b,NBYTES-1
  224.     dad    b
  225.     xchg
  226.     dad    b
  227.     ldax    d
  228.     ora    a
  229.     jp    fpcmp1
  230.     mov    a,m
  231.     ora    a
  232.     xchg
  233.     jm    fpcmp2
  234.     lxi    h,-1
  235.     pop    b
  236.     ret
  237.  
  238. fpcmp1:    mov    a,m
  239.     ora    a
  240.     jp    fpcmp2
  241.     lxi    h,1
  242.     pop    b
  243.     ret
  244.  
  245. fpcmp2:    call    icmp64
  246.     lxi    h,0
  247.     pop    b
  248.     rz
  249.     lxi    h,-1
  250.     rc
  251.     lxi    h,1
  252.     ret
  253. ;
  254. ;
  255. FPNEG:    lhld    arg2
  256.     xchg
  257.     lhld    arg4
  258.     xchg
  259.     lxi    b,NBYTES
  260.     ldir
  261.     lhld    arg4
  262.     lxi    b,nbytes-1
  263.     dad    b
  264.     mvi    a,080h
  265.     xra    m
  266.     mov    m,a
  267.     pop    b
  268.     ret
  269. ;
  270. ;
  271. FPCNV:    xchg
  272.     lxi    h,AREG
  273.     call    unpack        ; (arg2) --> Acc. (Unpack).
  274.     jmp    FPCONV
  275. ;
  276. ;
  277. LLADD:    xchg
  278.     lhld    arg4
  279.     push    h
  280.     xchg
  281.     lxi    b,NBYTES
  282.     ldir
  283.     pop    d
  284.     lhld    arg2
  285.     call    iadd64
  286.     pop    b
  287.     ret
  288.  
  289. LLSUB:    xchg
  290.     lhld    arg4
  291.     push    h
  292.     xchg
  293.     lxi    b,NBYTES
  294.     ldir
  295.     pop    d
  296.     lhld    arg3
  297.     call    isub64
  298.     pop    b
  299.     ret
  300.  
  301. LLMUL:    lxi    d,la
  302.     lxi    b,nbytes
  303.     ldir
  304.     lhld    arg3
  305.     call    imul64
  306.     lhld    arg4
  307.     xchg
  308.     lxi    h,la
  309.     lxi    b,nbytes
  310.     ldir
  311.     pop    b
  312.     ret
  313.  
  314. LLDIV:    lxi    d,la
  315.     lxi    b,nbytes
  316.     ldir
  317.     lhld    arg3
  318.     call    idiv64
  319.     lhld    arg4
  320.     xchg
  321.     lxi    h,la
  322.     lxi    b,nbytes
  323.     ldir
  324.     pop    b
  325.     ret
  326.  
  327. LLCMP:    lxi    b,NBYTES-1
  328.     dad    b
  329.     xchg
  330.     lhld    arg3
  331.     dad    b
  332.     ora    a
  333.     xchg
  334.     lhld    arg3
  335.     call    icmp64
  336.     lxi    h,0
  337.     pop    b
  338.     rz
  339.     lxi    h,-1
  340.     rc
  341.     lxi    h,1
  342.     ret
  343.  
  344. LLNEG:    call    ineg64
  345.     pop    b
  346.     ret
  347.  
  348. LLTEN:    call    itenth
  349.     pop    b
  350.     ret
  351.  
  352. LLMOV:    xchg
  353.     lhld    arg4
  354.     xchg
  355.     lxi    b,nbytes
  356.     ldir
  357.     pop    b
  358.     ret
  359.  
  360. LLSFTL:    lda    arg4
  361.     rar
  362.     call    sftl64
  363.     jmp    sftext
  364.  
  365. LLSFTR:    lxi    d,nbytes-1
  366.     dad    d
  367.     lda    arg3
  368.     rar
  369.     call    sftr64
  370.     pop    b
  371. sftext:    lxi    h,0
  372.     rnc
  373.     lxi    h,080h
  374.     ret
  375.  
  376. ATOLL:    mvi    a,' '
  377.     sta    asign
  378.     lxi    h,0
  379.     shld    la
  380.     shld    la+2
  381.     shld    la+4
  382.     shld    la+6
  383.     lhld    arg2
  384. encod1:    mov    a,m
  385.     call    isdigit
  386.     jnc    encod3
  387.     cpi    ' '
  388.     jz    encod2
  389.     cpi    '+'
  390.     jz    encoda
  391.     cpi    '-'
  392.     jnz    encod8
  393.     mvi    a,'-'
  394.     sta    asign
  395. encoda:    inx    h
  396.     jmp    encod3
  397. encod2:    inx    h
  398.     jmp    encod1
  399.  
  400. encod3:    mvi    b,18
  401. encod7:    mov    a,m
  402.     call    isdigit
  403.     jnc    encod9
  404.     cpi    ','
  405.     jnz    encod8
  406.     inx    h
  407.     jmp    encod7
  408. encod9:    push    b
  409.     push    h
  410.     push    psw
  411.     lxi    h,la
  412.     call    itenth
  413.     pop    psw
  414.     ani    0fh
  415.     lxi    h,la
  416.     add    m
  417.     mov    m,a
  418.     jnc    encod5
  419.     mvi    b,nbytes-1
  420. encod4:    inx    h
  421.     mvi    a,0
  422.     adc    m
  423.     mov    m,a
  424.     jnc    encod5
  425.     dcr    b
  426.     jnz    encod4
  427. encod5:    pop    h
  428.     pop    b
  429.     inx    h
  430.     dcr    b
  431.     jnz    encod7
  432.  
  433. encod8:    lda    asign
  434.     cpi    '-'
  435.     lxi    h,la
  436.     cz    ineg64
  437.     lhld    arg4
  438.     xchg
  439.     lxi    h,la
  440.     lxi    b,nbytes
  441.     ldir
  442.     pop    b
  443.     ret
  444.  
  445. LLTOA:    lxi    d,la
  446.     lxi    b,nbytes
  447.     ldir
  448.     lxi    h,outbuf
  449.     lxi    d,outbuf+1
  450.     lxi    b,18
  451.     mvi    m,' '
  452.     ldir
  453.     lxi    h,outbuf+19
  454.     mvi    m,0
  455.     lhld    la
  456.     mov    a,h
  457.     ora    l
  458.     jnz    decode
  459.     lhld    la+2
  460.     mov    a,h
  461.     ora    l
  462.     jnz    decode
  463.     lhld    la+4
  464.     mov    a,h
  465.     ora    l
  466.     jnz    decode
  467.     lhld    la+6
  468.     mov    a,h
  469.     ora    l
  470.     jnz    decode
  471.     lxi    h,outbuf+18
  472.     mvi    m,'0'
  473.     lxi    h,outbuf
  474.     pop    b
  475.     ret
  476.  
  477. decode:    lda    la+nbytes-1
  478.     ani    080h    
  479.     mvi    a,' '
  480.     jz    decod1
  481.     lxi    h,la
  482.     call    ineg64
  483.     mvi    a,'-'
  484. decod1:    sta    outsgn
  485.     lxi    h,outbuf+18
  486.     mvi    m,'0'
  487. decod3:    push    h
  488.     lxi    h,ten
  489.     call    idiv64
  490.     pop    h
  491.     jc    decod4
  492.     lda    la+nbytes
  493.     adi    '0'
  494.     mov    m,a
  495.     dcx    h
  496.     mov    a,m
  497.     ana    a
  498.     jnz    decod3
  499. decod4:    lda    outsgn
  500.     mov    m,a
  501.     lxi    h,outbuf
  502.     pop    b
  503.     ret
  504.  
  505. FPHALF:    xchg
  506.     lhld    arg4
  507.     xchg
  508.     lxi    b,nbytes
  509.     ldir
  510.     lhld    arg4
  511.     lxi    d,nbytes-2
  512.     dad    d
  513.     mov    a,m
  514.     sui    010h
  515.     mov    m,a
  516.     jnc    fphlf1
  517.     inx    h
  518.     dcr    m
  519. fphlf1:    pop    b
  520.     ret
  521.  
  522. FPDBL:    xchg
  523.     lhld    arg4
  524.     xchg
  525.     lxi    b,nbytes
  526.     ldir
  527.     lhld    arg4
  528.     lxi    d,nbytes-2
  529.     dad    d
  530.     mov    a,m
  531.     adi    010h
  532.     mov    m,a
  533.     jnc    fpdbl1
  534.     inx    h
  535.     inr    m
  536. fpdbl1:    pop    b
  537.     ret
  538.  
  539. FPSFT:    xchg
  540.     lhld    arg4
  541.     xchg
  542.     lxi    b,nbytes
  543.     ldir
  544.     lhld    arg3
  545.     mov    a,h
  546.     ora    l
  547.     jz    fpsft5
  548.     dad    h
  549.     dad    h
  550.     dad    h
  551.     dad    h
  552.     xchg
  553.     lhld    arg4
  554.     lxi    b,nbytes-1
  555.     dad    b
  556.     push    h
  557.     mov    a,m
  558.     dcx    h
  559.     mov    l,m
  560.     mov    h,a
  561.     ani    080h
  562.     dadc    d
  563.     jpo    fpsft4        ; parity=odd --> no overflow.
  564.     lxi    h,0
  565.     jnc    fpsft3
  566.     lxi    h,07fffh
  567. fpsft3:    ora    h
  568.     mov    h,a
  569. fpsft4:    xchg
  570.     pop    h
  571.     mov    m,d
  572.     dcx    h
  573.     mov    m,e
  574. fpsft5:    pop    b
  575.     ret
  576. ;
  577. ;--------------------------------------------------------------
  578. ; FLOATING POINT DIVIDE ------ Acc = Acc / Bcc.
  579. ;--------------------------------------------------------------
  580.  
  581. FPDIV0:    lxi    h,0
  582.     shld    OVF
  583.     shld    ZERO
  584.     lhld    BEXP
  585.     mov    a,h
  586.     ora    l
  587.     jz    ovrfw
  588.     lhld    AEXP
  589.     mov    a,h
  590.     ora    l
  591.     jz    setzero
  592.     ;
  593. fdiv1:    lxi    h,0
  594.     shld    LA